package com.xing.binbackend.pattern.proxy21.acore;

/**
 * 一、代理模式核心原理
 * 代理模式通过中间层控制对象访问，核心结构包含：
 *      抽象主题（Subject）：定义业务接口
 *      真实主题（Real Subject）：业务具体实现
 *      代理类（Proxy）：控制访问并增强功能
 *
 * 符合代理模式的核心特征：
 *      实现相同ProductService接口
 *      持有被代理对象（target）
 *      控制目标对象访问（仅在缓存未命中时调用真实方法）
 *
 *  什么情况下用动态代理 或 静态代理？
 *      静态代理：此处是静态代理模式，不需要反射机制，通过直接编码实现
 *      动态代理：使用JDK动态代理才会涉及反射（通过Proxy.newProxyInstance）。
 *          更适合 1. 需要统一处理多个无关类（如全局日志、事务等AOP需求）其实操作日志就是这样
 *                2. 代理逻辑与业务完全解耦（如权限校验等横切关注点）
 *                3. 被代理对象在编译期不确定（如插件系统）
 *  模式本质：代理模式的核心是控制访问而非必须使用反射，此处通过组合方式实现符合代理模式定义
 */
public class Client {
    public static void main(String[] args) {
//        ProductService service = (ProductService) CacheProxy.createProxy(
//                new ProductServiceImpl()
//        );
//        // 第一次调用访问真实服务
//        System.out.println(service.getProductInfo("1001"));
//        // 第二次调用走缓存
//        System.out.println(service.getProductInfo("1001"));
    }
}
